const jwt = require('jsonwebtoken')

// 创建密钥 弄复杂点儿，不能外泄，确保安全
const SECRETKEY = 'jwt&sk_login/20220907_private#ok'
// 创建token过期时间，单位s，这里配置为30天内有效
const expiresIn = 60 * 60 * 24 * 30
// token验证中间件
const verifyToken = async (ctx, next) => {
  let url = ctx.request.url.split('?')[0]
  // 以下接口不验证token
  const ignoreUrl = [
    '/register',
    '/login',
  ]
  // 检测接口是否在不验证的列表里
  const isIgnoreUrl = ignoreUrl.some(item => item === url)
  if (isIgnoreUrl) {
    await next()
  } else {
    // 从请求头中获取token和userName
    const token = ctx.request.header.token
    // 注意这里：header中的字段都是小写字母，所以userName会变成username
    const userName = ctx.request.header.username
    if (token && userName) {
      jwt.verify(token, SECRETKEY, async (err, decoded) => {
        if (err) {
          console.log('err: ', err)
          if (err.name === 'TokenExpiredError') {
            ctx.body = {
              code: '0008',
              msg: 'token已过期'
            }
          } else if (err.name === 'JsonWebTokenError') {
            ctx.body = {
              code: '0009',
              msg: '无效的token'
            }
          } else {
            ctx.body = {
              code: '0011',
              msg: 'token已失活'
            }
          }
        } else {
          console.log('decoded: ', decoded)
          if (decoded.userName !== userName) {
            ctx.body = {
              code: '0009',
              msg: '无效的token'
            }
          } else {
            await next()
          }
        }
      })
    } else {
      ctx.body = {
        code: '0010',
        msg: '登录信息已过期'
      }
    }
  }
}

module.exports = {
  SECRETKEY,
  expiresIn,
  verifyToken
}